/*
 * 知识点 :   名字空间别名
 */

#include <iostream> 
using namespace std;

void print(int money)
{
	cout << __LINE__<< " : " << money << endl;
}

/* 名字空间的定义*/

namespace abc {      // 农行 名字空间
	int balance = 0;
	void save (int money) // 存钱
	{
		balance += money;
	}

	void print(int money)
	{
		cout << __LINE__<< " : " << money << endl;
	}

	void show()
	{
		//cout << balance << endl;
		print(balance);
	}

};

/* 名字空间的合并*/
namespace abc {    // 建行 名字空间
	void draw(int money) // 取钱
	{
		balance -= money;
	}


};  //  名字空间  ;分号可缺省


// 建行
namespace ccb {
	int balance = 0;
	void save (int money) // 存钱
	{
		balance += money;
	}

	void draw(int money); //  作用域函数声明
	void show()
	{
		//cout << balance << endl;
		::print(balance);   //  无名名字空间
	}
};

/**作用域函数定义**/
void ccb::draw(int money) // 取钱
{
	balance -= money;
}

namespace ns1{
	int x = 1;
	namespace ns2{
		int x = 12;
		namespace ns3{
			int x = 123;
			namespace ns4{
			   int x = 1234;	
			}
		}
	}
}


int main(void)
{
	/*使用名字空间*/
	abc::save(5000);  // 作用域限定符 ::
	cout << abc::balance << endl;
	abc::draw(3000);
	cout << abc::balance << endl;

	ccb::save(8000);
	cout << ccb::balance << endl;
	ccb::draw(2000);
	cout << ccb::balance << endl;

	//ccb::show()
	using namespace ccb; /* 名字空间指令 : ccb名字空间内的所有标志符，声明为可见; 只能打开，不能关闭
							不该变作用与的隶属关系
							*/
	show();              // 此时只能看见，　ccb::show()  


	//using namespace abc; // 空间指令 : 
	//show();              // 能看见，　ccb::show() ,abc::show()，有连个show,歧义 ,编译器举棋不定,编译错误


	using abc::show;     // 名字空间声明 ,名字隐藏原则,隐藏覆盖掉了ccb::show,小作用与可以隐藏大作用域名 ,  改变作用域的隶属关系，将　abc::show 引入到当前作用域

	show();              // 不报错误
	
	cout << ns1::x << endl;
	cout << ns1::ns2::x << endl;
	cout << ns1::ns2::ns3::x << endl;
	cout << ns1::ns2::ns3::ns4::x << endl;
	using namespace ns1::ns2::ns3::ns4;
	cout << x << endl;
	namespace ns_four = ns1::ns2::ns3 ; // 名字空间别名
	cout << ns_four::x  << endl;

	return 0;
}


